#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
/**
 * c++结构体
 * 结构体定义后是不占用空间的，因为结构体里面的属性只是类型，并没有赋值
 * 如果结构体在定义的时候如果不初始化，则会造成野指针等问题，因此最好在结构体里面写上构造函数
 * 结构体的直接赋值就是浅拷贝，如果没有指针类型的变量则不用担心
 */

struct Student
{
    int num;
    char name[32];
};

// 一次性结构体
// 这样形式定义的结构体只能够使用这一个，相当于是单例模式
struct
{
    int num;
    char name[32];
} lucy;

void test01()
{
    Student bob;
    // 初始化
    Student lucy = {100, "lucy"};
    std::cout << lucy.num << " " << lucy.name << std::endl;

    lucy.num = 99;

    // 清空结构体
    memset(&lucy, 0, sizeof(lucy));
    std::cout << lucy.num << " " << lucy.name << std::endl;

    // 结构体中的name是数组名，不能使用=进行赋值
    strcpy(lucy.name, "bob");
    // lucy.name = 10;
    std::cout << lucy.num << " " << lucy.name << std::endl;
}

void test02()
{
    Student lucy = {100, "lucy"};
    Student bob;
    // 单个变量赋值
    // bob.num = lucy.num;
    // strcpy(bob.name, lucy.name);
    // 直接赋值（推荐）
    bob = lucy;
    strcpy(bob.name, "bob");
    std::cout << bob.name << " " << lucy.name << std::endl;
}

/**
 * 结构体的深拷贝
 */
void test03()
{
}

int main()
{
    test02();
    std::cout << "struct study " << std::endl;
    return 0;
}